<?php

	// 公共函数文件
	declare (strict_types = 1);


	/**
	 * 发送curl请求
	 * @param String $url  要请求的URL
	 * @param String $method  请求方法[get/post]
	 * @param String/Array $post_data  请求数据，模拟表单提交时为Array，提交JSON数据时为String
	 * @param String $data_type  数据类型[form/file/json/xml]
	 * @param Array $header 请求头，存在相同键时新值覆盖旧值，默认为空
	 * @return Array
	 * @author 杨铭
	 */
	function curlRequest(
		string $url,
		string $method,
		$post_data='',
		string $data_type='form',
		array $header=[]
	) {
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		// 为项目内调用设置专用的UA
		curl_setopt($ch, CURLOPT_USERAGENT, 'Intract cURL');
		// 设置为不自动输出
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		// 输出头部
		curl_setopt($ch, CURLOPT_HEADER, true);
		// 跳过证书检查
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		// 不从证书中检查SSL加密算法是否存在
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
		// 代理
		$curl_proxy = config('app.curl_proxy');
		if( !empty($curl_proxy) )
		{
			curl_setopt($ch, CURLOPT_PROXY, $curl_proxy);
		}

		if($method == 'post')
		{
			// 根据$data_type，选择不同的HTTP Header
			$data_type = strtolower($data_type);
			switch($data_type)
			{
				case 'form':
					$content_type = 'application/x-www-form-urlencoded';
					$post_data = http_build_query($post_data);
					break;
				case 'file':
					$content_type = 'multipart/form-data';
					break;
				case 'json':
					$content_type = 'application/json';
                    $post_data = json_encode($post_data, 256);
					break;
				case 'xml':
					$content_type = 'text/xml';
					break;
				default:
					// 默认为form
					$content_type = 'application/x-www-form-urlencoded';
			}
			$default_header = [
				'Content-type: ' . $content_type,
				// 'Content-length: ' . strlen($post_data)
			];
			$header = array_merge($default_header, $header);
		}

		// 根据不同的提交方式，设置头部和数据
		$method = strtolower($method);
		switch($method)
		{
			case 'get':
				break;
			case 'post':
				// 设置头部
				curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
				// 设置POST提交
				curl_setopt($ch, CURLOPT_POST, true);
				// 设置POST数据
				curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
				break;
			default:
				;
		}
		// 执行请求
		$response = curl_exec($ch);
		// 获取响应头
		$response_header_length = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
		$response_header = substr($response, 0, $response_header_length);
		// 获取响应数据
		$response_data = substr($response, $response_header_length);

		// 返回数据
		$res = [
			'status' => 0,
			'err_msg' => '',
			'http_code' => curl_getinfo($ch, CURLINFO_HTTP_CODE),
			'content_type' => curl_getinfo($ch, CURLINFO_CONTENT_TYPE),
			'header' => null,
			'data' => null
		];
		if($response === false)
		{
			$res['err_msg'] = curl_error($ch);
		}
		else
		{
			$res['status'] = 1;
			$res['header'] = $response_header;
			$res['data'] = $response_data;
		}
		// 关闭连接
		curl_close($ch);

		return $res;
	}
